package org.tltv.gantt.demo.util;
import java.util.Arrays;
import java.util.Collection;
import com.vaadin.data.HasValue.ValueChangeEvent;
import com.vaadin.data.HasValue.ValueChangeListener;
import com.vaadin.server.Sizeable.Unit;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.NativeSelect;
import com.vaadin.ui.Notification;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
public class Util {
public static TextField createNumberEditor(String caption, float value, final Component component,
final NumberValueChange valueChange) {
TextField field = new TextField(caption);
field.setMaxLength(5);
field.setValue("" + value);
field.addValueChangeListener(new ValueChangeListener<String>() {
@Override
public void valueChange(ValueChangeEvent<String> event) {
Object v = event.getValue();
try {
float f = Float.parseFloat("" + v);
valueChange.onValueChange(f);
} catch (NumberFormatException e) {
Notification.show("Invalid floating number! Format is 123.345");
}
}
});
return field;
}
public static TextField createTextEditor(String caption, String value, final Component component,
final TextValueChange valueChange) {
TextField field = new TextField(caption);
field.setValue("" + value);
field.addValueChangeListener(new ValueChangeListener<String>() {
@Override
public void valueChange(ValueChangeEvent<String> event) {
Object v = event.getValue();
valueChange.onValueChange(String.valueOf(v));
}
});
return field;
}
public static TextField createHeightEditor(final Component component) {
return createNumberEditor("Height", component.getHeight(), component, new NumberValueChange() {
@Override
public void onValueChange(float number) {
component.setHeight(number, component.getHeightUnits());
}
});
}
public static TextField createWidthEditor(final Component component) {
return createNumberEditor("Width", component.getWidth(), component, new NumberValueChange() {
@Override
public void onValueChange(float number) {
component.setWidth(number, component.getWidthUnits());
}
});
}
public static NativeSelect createHeightUnitEditor(final Component component) {
return createNativeSelectEditor("Height Unit", component.getHeightUnits(),
Arrays.asList(Unit.PERCENTAGE, Unit.PIXELS), new SelectValueChange() {
@Override
public void onValueChange(Object unit) {
component.setHeight(component.getHeight(), (Unit) unit);
}
});
}
public static NativeSelect createWidthUnitEditor(final Component component) {
return createNativeSelectEditor("Width Unit", component.getWidthUnits(),
Arrays.asList(Unit.PERCENTAGE, Unit.PIXELS), new SelectValueChange() {
@Override
public void onValueChange(Object unit) {
component.setWidth(component.getWidth(), (Unit) unit);
}
});
}
public static NativeSelect createNativeSelectEditor(String caption, Object value, Collection<Object> items,
final SelectValueChange valueChange) {
NativeSelect<Object> s = new NativeSelect<>(caption);
s.setItemCaptionGenerator(item -> String.valueOf(item));
s.setItems(items);
s.setEmptySelectionAllowed(false);
s.setValue(value);
s.addValueChangeListener(new ValueChangeListener<Object>() {
@Override
public void valueChange(ValueChangeEvent<Object> event) {
valueChange.onValueChange(event.getValue());
}
});
return s;
}
public static void showConfirmationPopup(String msg, final Runnable callback) {
Window window = new Window();
window.setModal(true);
window.center();
window.setWidth(400, Unit.PIXELS);
window.setClosable(false);
window.setResizable(false);
VerticalLayout content = new VerticalLayout();
content.setWidth(100, Unit.PERCENTAGE);
content.setSpacing(true);
content.setMargin(true);
Label l = new Label(msg);
content.addComponent(l);
HorizontalLayout buttons = new HorizontalLayout();
buttons.setSpacing(true);
Button ok = new Button("OK");
ok.setData(window);
ok.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
callback.run();
((Window) event.getButton().getData()).close();
}
});
Button cancel = new Button("Cancel");
cancel.setData(window);
cancel.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
((Window) event.getButton().getData()).close();
}
});
buttons.addComponent(ok);
buttons.addComponent(cancel);
content.addComponent(buttons);
window.setContent(content);
UI.getCurrent().addWindow(window);
}
public interface TextValueChange {
void onValueChange(String value);
}
public interface NumberValueChange {
void onValueChange(float number);
}
public interface SelectValueChange {
void onValueChange(Object value);
}
}